package com.wondertek.onvif.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * ONVIF兼容性服务
 * 处理不同设备厂商和版本的兼容性问题
 */
@Slf4j
@Service
public class OnvifCompatibilityService {

    /**
     * 检查是否是ActionNotSupported错误
     */
    public boolean isActionNotSupportedError(String errorContent) {
        if (errorContent == null) {
            return false;
        }
        
        return errorContent.contains("wsa:ActionNotSupported") || 
               errorContent.contains("ActionNotSupported") ||
               errorContent.contains("The [action] cannot be processed at the receiver") ||
               errorContent.contains("The invalid operation name");
    }
    
    /**
     * 检查是否是SOAP Fault响应
     */
    public boolean isSoapFault(String content) {
        if (content == null) {
            return false;
        }
        
        return content.contains("SOAP-ENV:Fault") || 
               content.contains("soap:Fault") || 
               content.contains("env:Fault");
    }
    
    /**
     * 提取SOAP Fault中的错误原因
     */
    public String extractSoapFaultReason(String soapFault) {
        if (soapFault == null) {
            return null;
        }
        
        try {
            // 提取 SOAP-ENV:Text 中的文本
            String reasonStart = "<SOAP-ENV:Text>";
            String reasonEnd = "</SOAP-ENV:Text>";
            int startIndex = soapFault.indexOf(reasonStart);
            if (startIndex != -1) {
                startIndex += reasonStart.length();
                int endIndex = soapFault.indexOf(reasonEnd, startIndex);
                if (endIndex != -1) {
                    return soapFault.substring(startIndex, endIndex).trim();
                }
            }
            
            // 尝试提取 Detail 信息
            String detailStart = "<SOAP-ENV:Detail>";
            String detailEnd = "</SOAP-ENV:Detail>";
            startIndex = soapFault.indexOf(detailStart);
            if (startIndex != -1) {
                startIndex += detailStart.length();
                int endIndex = soapFault.indexOf(detailEnd, startIndex);
                if (endIndex != -1) {
                    return soapFault.substring(startIndex, endIndex).trim();
                }
            }
            
            // 尝试提取简单的文本内容
            if (soapFault.contains("cannot be processed at the receiver")) {
                return "操作不被设备支持";
            }
            
            if (soapFault.contains("invalid operation name")) {
                return "无效的操作名称";
            }
            
        } catch (Exception e) {
            log.debug("提取SOAP错误信息失败: {}", e.getMessage());
        }
        
        return null;
    }
    
    /**
     * 判断设备连接是否应该被认为是成功的（即使有ActionNotSupported错误）
     */
    public boolean shouldTreatAsPartialSuccess(String errorContent, int responseCode) {
        // 对于ActionNotSupported错误，如果是400状态码，可以认为是部分成功
        // 因为设备至少能够响应SOAP请求，只是不支持特定操作
        if (responseCode == 400 && isActionNotSupportedError(errorContent)) {
            log.info("检测到ActionNotSupported错误，将其视为部分兼容（设备可连接但不支持该操作）");
            return true;
        }
        
        return false;
    }
    
    /**
     * 生成兼容性建议
     */
    public String generateCompatibilityAdvice(String errorContent, int responseCode) {
        StringBuilder advice = new StringBuilder();
        
        if (isActionNotSupportedError(errorContent)) {
            advice.append("兼容性建议:\n");
            advice.append("1. 设备不支持当前ONVIF操作，但连接正常\n");
            advice.append("2. 可以尝试使用基础的GetDeviceInformation操作\n");
            advice.append("3. 检查设备的ONVIF版本和支持的服务列表\n");
            advice.append("4. 某些老版本设备可能只支持部分ONVIF功能\n");
            advice.append("5. 建议升级设备固件以获得更好的ONVIF兼容性\n");
        } else if (isSoapFault(errorContent)) {
            advice.append("SOAP错误处理建议:\n");
            advice.append("1. 检查SOAP请求格式是否正确\n");
            advice.append("2. 验证设备是否支持当前ONVIF版本\n");
            advice.append("3. 尝试使用不同的认证方式\n");
            advice.append("4. 检查设备的ONVIF服务配置\n");
        }
        
        return advice.toString();
    }
    
    /**
     * 检查错误是否应该被忽略（用于兼容性处理）
     */
    public boolean shouldIgnoreError(String errorContent, int responseCode) {
        // ActionNotSupported错误可以被忽略，因为设备至少是可连接的
        return shouldTreatAsPartialSuccess(errorContent, responseCode);
    }
    
    /**
     * 获取兼容性状态描述
     */
    public String getCompatibilityStatus(String errorContent, int responseCode) {
        if (shouldTreatAsPartialSuccess(errorContent, responseCode)) {
            return "部分兼容 - 设备连接正常但不支持某些ONVIF操作";
        } else if (responseCode >= 200 && responseCode < 300) {
            return "完全兼容 - 设备支持标准ONVIF操作";
        } else {
            return "不兼容 - 设备无法正常响应ONVIF请求";
        }
    }
}